package com.example.demo.common;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.HashMap;

/**
 *  统一数据格式处理,也相当于是保底的
 *  1.加注解 ControllerAdvice
 *  2.实现接口 ResponseBodyAdvice ,重写两个方法
 */
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper; // 用于将 Java对象 和 json 字符串进行相互转换

    /**
     * 默认是返回 false 也就是不执行下面的方法 beforeBodyWrite，这次我们改成 true
     * 是否执行 beforeBodyWrite 方法，true=执行，重写返回结果
     * @param returnType
     * @param converterType
     * @return
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
//        return false;
        return true;
    }

    /**
     *
     *  返回数据之前进行数据重写，改变他的格式，HashMap(再次我们约定的就是 HashMap，实际企业中并不会用这种方式)
     * @param body
     * @param returnType
     * @param selectedContentType
     * @param selectedConverterType
     * @param request
     * @param response
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        // return null;
        // HashMap<String,Object>  ->  code,msg,data
        if(body instanceof HashMap) {  // 判断body是否是 HashMap 的格式
            return body;
        }

        // 如果不是，封装到 HashMap 中去
        HashMap<String,Object> hashMap = new HashMap<>();
        hashMap.put("code",200);
        hashMap.put("data",body);
        hashMap.put("massage","");

        // 在此处进行判断 body 的内容，如果是 字符串 进行单独处理
        // 还需要注入 ObjectMapper 对象
        // @Autowired
        // private ObjectMapper objectMapper; // 用于将 Java对象 和 json 字符串进行相互转换
        // 方案1：writeValueAsString 作用：不要让 string 进行类型转换，直接就是 string 就可以了，string转换有问题
        // 方案2：在config中进行配置，移除掉 string 的httpmassage
        if(body instanceof String) {
            try {
                return objectMapper.writeValueAsString(hashMap);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return hashMap;
    }
}
